// 题目：做题
// 小杨同学为了提高自己实力制定了做题计划，在第d天时，他必须要完成d道题，否则他就会偷懒。
// 现在有n套题单，每套题单有若干题，每天只能用一套题单，且每套题单只能用一次。
// 每套题单可以只做部分题。问小杨同学最多会做题几天才偷懒？
// 输入格式：
// 第一行，两个整数 n d，表示有多少套题单和每天必须完成的题数。
// 第二行，n个整数，分别表示每套题单有多少道题。
// 输出格式：
// 输出一行，小杨同学偷懒前最多做题天数。
// 样例：
// 输入：
// 3 2
// 3 4 5
// 输出：
// 6
// 解题思路：
// 每天必须做d道题，否则就会偷懒。每套题单只能用一次，每天只能用一套题单，且可以只做部分题。
// 对于每套题单，最多能“贡献”多少天？就是题单题数 / d 向下取整。所有题单贡献天数之和即为答案。
// 例如：n=3, d=2, 题单分别有3,4,5道题，则分别能贡献1,2,2天，总共6天。
#include <bits/stdc++.h>
#define maxn 1000006
using namespace std;
long long a[maxn]; // 存储每套题单的题数
int n;

int main()
{
    int m, ans = 0;
    cin >> n; // 读入题单数
    m = n;    // m用于控制天数
    int s = 1; // s为当前可用题单的起始下标（优化查找）
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i]; // 读入每套题单的题数
    }
    sort(a + 1, a + n + 1); // 题单按题数升序排序，贪心优先用题数少的
    for (int j = 1; j <= m; j++) // 第j天，必须做j道题
    {
        for (int k = s; k <= n; k++) // 从当前可用题单开始查找
        {
            if (j <= a[k]) // 找到第一个能满足j道题的题单
            {
                ans++;     // 这一天可以完成
                a[k] = j;  // 题单只用一次，题数设为j（防止重复用）
                s = k;     // 下次从这里开始查找，优化效率
                break;     // 进入下一天
            }
        }
    }
    cout << ans; // 输出最多能坚持的天数
    return 0;
}